package com.smartboot.plus.condition;

import java.lang.invoke.SerializedLambda;
import java.lang.reflect.Method;

public class LambdaCondition {

    /**
     * 提取字段名，例如从 MqttAclCache::getCreatedAt 中提取 "createdAt"
     */
    public static <T> String resolveFieldName(SFunction<T, ?> fn) {
        try {
            // 获取 lambda 表达式中的 writeReplace 方法
            Method method = fn.getClass().getDeclaredMethod("writeReplace");
            method.setAccessible(true);
            SerializedLambda serializedLambda = (SerializedLambda) method.invoke(fn);

            // 获取实现方法名，例如 getCreatedAt
            String implMethodName = serializedLambda.getImplMethodName();

            // 转换为字段名（去除 get/is 前缀，首字母小写）
            if (implMethodName.startsWith("get")) {
                return decapitalize(implMethodName.substring(3));
            } else if (implMethodName.startsWith("is")) {
                return decapitalize(implMethodName.substring(2));
            } else {
                throw new IllegalArgumentException("无效的 getter 方法: " + implMethodName);
            }

        } catch (Exception e) {
            throw new RuntimeException("无法解析字段名", e);
        }
    }

    /**
     * 首字母小写（如 "CreatedAt" -> "createdAt"）
     */
    private static String decapitalize(String str) {
        if (str == null || str.isEmpty()) return str;
        if (str.length() == 1) return str.toLowerCase();
        return Character.toLowerCase(str.charAt(0)) + str.substring(1);
    }
}
